/**
 * DialogueBD.java    01/02/2012
 */

package l3.info.Projet.Client;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import l3.info.Projet.Utilitaires.Chiffrement;


/**
 * Classe utilitaire permettant de faire différentes
 * opérations sur une base de données
 * @author Loic Martinez
 * @version 1.0
 */

public class DialogueBD {

	/**
	 * Permet de se connecter à une base de données postgresql
	 * @param url, l'url de la base de données
	 * @param user, l'utilisateur de la base de données
	 * @param passwd, le mot de passe de l'utilisateur
	 * @return conn, la connexion à la base de données
	 */
	public static Connection connexionSQL(String url,
			String user, String passwd) {
		Connection conn = null;

		try {
			Class.forName("org.postgresql.Driver");
			conn = DriverManager.getConnection(url, user, passwd);
		} catch (Exception e) {
			System.err.println("Erreur de connexion à la base de données !");
		}

		return conn;
	}

	/**
	 * Permet de savoir si l'utilisateur existe, si oui, on passe 
	 * la variable "connexion du user à true, sinon, elle reste à false
	 * @param conn, la connexion à la base de données
	 * @param user, l'Utilisateur
	 * @param table, la table SQL
	 */
	public static void getExistingUserTable(Connection conn, Utilisateur user,
			String table) {
		
		// Si = 1, l'utilisateur existe, sinon non
		String requete = "SELECT COUNT(numUtilisateur) FROM " + table 
				+ " WHERE numUtilisateur = " + user.getId()
				+ " AND MotDePasse = '" + user.getMdp() + "';";
		
		try {
			// Exécution de la requête
			Statement state = conn.createStatement();
			ResultSet result = state.executeQuery(requete);

			// Un résultat trouvé, l'utilisateur existe
			if (result.next()) {
				user.setConnexion(true);
			}

			result.close();
			state.close();
			
		} catch (Exception e) {
			System.err.println("Erreur lors de la récupération des données !");
		}
	}
	
	/**
	 * Permet d'avoir toutes les données sur l'utilisateur user
	 * @param conn, la connexion à la base de données
	 * @param user, l'utilisateur
	 * @param tableUser, la table des utilisateurs
	 * @param tableMessage, la table des messages
	 * @return user, mis à jour avec ses données
	 */
	public static Utilisateur getDataFromUserTableWhenConnected(Connection conn,
			Utilisateur user, String tableUser, String tableMessage) {
		
		String requete = "SELECT nomUtilisateur FROM " + tableUser 
				+ " WHERE numUtilisateur = " + user.getId() + ";";
		
		try {
			// Exécution de la requête
			Statement state = conn.createStatement();
			ResultSet result = state.executeQuery(requete);

			// On a trouvé la ligne
			// On met à jour le user avec toutes ses données
			if (result.next()) {
				user.setPseudo(result.getString("nomUtilisateur"));
				user.setMessages(getDataFromMessageTable(conn, user.getId(), 
						tableMessage));
			}

			result.close();
			state.close();
			
		} catch (Exception e) {
			System.err.println("Erreur lors de la récupération des données !");
		}
		return user;
	}
	
	/**
	 * Renvoie tous les messages pour un utilisateur
	 * @param conn, la connexion à la base de données
	 * @param numUtilisateur, le numéro de l'utilisateur
	 * @param table, la table des messages
	 * @return, tous les messages contenus dans une List
	 */
	public static List<Message> getDataFromMessageTable(Connection conn, 
			int numUtilisateur, String table) {
		
		List<Message> listMessages = new ArrayList<Message>();
		String requete = "SELECT * FROM " + table 
				+ " WHERE ecrivain = " + numUtilisateur + ";";
		
		try {
			// Exécution de la requête
			Statement state = conn.createStatement();
			ResultSet result = state.executeQuery(requete);

			// Tant qu'on trouve des n-uplets
			while (result.next()) {
				Message message = new Message(result.getInt("IdMessage"),
						result.getString("message"), result.getInt("ecrivain"),
						result.getDate("heureCreation"));
				
				// On ajoute la ligne à la List final
				listMessages.add(message);
			}

			result.close();
			state.close();
			
		} catch (Exception e) {
			System.err.println("Erreur lors de la récupération des données !");
		}
		return listMessages;
	}
	
	public static void main(String[] args) {
		Connection conn = connexionSQL("jdbc:postgresql://localhost/projetJava",
				"postgres", "azrael");

		List<Message> l = getDataFromMessageTable(conn, 1, "Message");
		
		Utilisateur user = new Utilisateur(1, Chiffrement.toMD5("loic"),
				null, null);
		getExistingUserTable(conn, user, "Utilisateur");
		System.out.println(user.getConnexion()); // OK, est à true
		
		user = getDataFromUserTableWhenConnected(conn, user, "Utilisateur",
				"Message");
		System.out.println("Id : " + user.getId() + "\nPseudo : " 
				+ user.getPseudo()
				+ "\nMdp : " + user.getMdp() + "\nConnexion : " 
				+ user.getConnexion()); // OK, tout a été renseigné
		
		for (Message m : l) {
			System.out.println("Message : " + m.getMessage()
					+ "\nEcrivain : " + m.getEcrivain() 
					+ "\nIdMessage : " + m.getIdMessage()
					+ "\nDate : " + m.getDateCreation().toString());
		} // OK, tous les messages sont présents
	}
}
